from selenium import webdriver
import time
import re
import json
import os

d = webdriver.Chrome(executable_path='C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe')
############################################全局变量###########################################################
Keys = ["顶替"]  # 搜索关键词
Out_Keys = ["的微博"]  # 按关键词屏蔽
Out_equal_keys = ["微博", ]  # 精准全名称屏蔽
Out_put_dir = "."
Search_res = []
weibo_set = []
name_set = []
max_page_num = 10  # 限定的最大搜索页数


#######################################################################################################

#################################################测试函数###############################################
def write_name():
    global name_set
    print("注意，现在运行的代码是测试内容，运行任务时你不应该看见我。")
    with open("name.txt", "w+", encoding="utf-8") as f:
        for i in name_set:
            print("正在写入：" + i[0] + " " + i[1] + "\n")
            f.write(i[0] + "\t" + i[1] + "\n")


#######################################################################################################

#######################################生成一个标准格式的微博结构#######################################################
"""
weibo={
    "username":
    "date":
    "text":
    "reply_num":
    "reply":[reply1, reply2, ...]
}
"""


def build_a_weibo(username, date, text, reply_num=0, reply=[]):
    return {
        "username": username,
        "date": date,
        "text": text,
        "reply_num": reply_num,
        "reply": reply
    }


#######################################################################################################
##############################################时间格式化#########################################################
"""
    微博的时间有的时候不完整，需要填充。
    * 16:20
    * 2020-06-28 16:20
    * 2020-06-28
    * 3分钟前
"""


def full_time(time_str):
    # 获取当前时间，如果没有，则为当前时间
    t = time.localtime(time.time())
    now = "%4d-%02d-%02d" % (t.tm_year, t.tm_mon, t.tm_mday)  # 现在的时间
    # 正则表达式匹配日期值
    cmp = re.compile(r"\d{4}-\d{2}-\d{2}")  # 2019-06-28
    res = cmp.match(time_str)
    if res is not None:
        return res.group()
    else:
        cmp = re.compile(r"\d{1,2}-\d{2}")  # 06-28
        res = cmp.match(time_str)
        if res is not None:
            return "%4d-%s" % (t.tm_year, str(res.group()))
        else:
            return now


#######################################################################################################
#############################################解析m.weibo.cn域名下的网站,如果失败返回空表##############################
def build_a_weibo(username, date, text, reply_num=0, reply=[]):
    return {
        "username": username,
        "date": date,
        "text": text,
        "reply_num": reply_num,
        "reply": reply
    }


def get_all_div_of_weiboCN_reply():
    while True:
        set_A = d.find_elements_by_css_selector(".m-img-box+div")
        d.execute_script("window.scrollBy(0,100000)")
        time.sleep(1)
        set_B = d.find_elements_by_css_selector(".m-img-box+div")
        print(str(len(set_A)) + ":" + str(len(set_B)))
        if (len(set_A) == len(set_B)):
            print("weiboCN> 满了！")
            return set_B
        else:
            print("weiboCN> 还能滚动！")
            continue


def go_for_a_weiboCN(link):
    b_user = ""
    b_text = ""
    b_mytime = ""
    reply_list = []
    
    d.get(link)
    b_res = d.find_elements_by_css_selector(".m-text-box>a>h3.m-text-cut")
    if len(b_res) == 1:
        b_user = str(b_res[0].text)
    else:
        print("error in weiboCN")
        return {}
    b_res = d.find_elements_by_css_selector(".weibo-og>.weibo-text")
    if len(b_res) == 1:
        b_text = str(b_res[0].text)
    else:
        print("error in weiboCN")
        return {}
    b_res = d.find_elements_by_css_selector("h4.m-text-cut>.time")
    if len(b_res) == 1:
        b_mytime = full_time(str(b_res[0].text))
    else:
        print("error in weiboCN")
        return {}
    # 获取回复列表
    reply_list = []
    set_div = get_all_div_of_weiboCN_reply()
    for a_div in set_div:
        ss = str(a_div.text).split('\n')
        name = ss[0]
        text = ss[1]
        mydate = ss[-2]  # 倒数第二个
        mydate = full_time(mydate)
        praise = ss[-1]  # 点赞数，还没用
        reply_list.append(build_a_weibo(
            username=name,
            text=text,
            date=mydate
        ))
    return build_a_weibo(
        username=b_user,
        date=full_time(b_mytime),
        text=b_text,
        reply_num=len(reply_list),
        reply=reply_list
    )


#######################################################################################################


############################################检测登录状态###########################################################
def test_login_state():
    no_log_in = True
    is_log_in = False
    global d

    res = d.find_elements_by_css_selector(".u>.ut>a")
    if len(res) >= 1:
        # 未登录的检测
        print("检测到一些内容...")
        if res[0].text == "登录" and res[1].text == "注册":
            print("现在，检测到你没有登录。[1/4]")
            no_log_in = True
        else:
            print("现在，检测到你的登录。[2/4]")
            no_log_in = False
        # 已登录的检测
        if res[0].text == "" and res[1].text == "详细资料" and res[2].text == "设置":
            print("现在，检测到你的登录。[3/4]")
            print(d.find_elements_by_css_selector(".u>.ut")[0].text)
            is_log_in = True
        else:
            print("现在，检测到你没有登录。[4/4]")
            is_log_in = False
    if no_log_in == True and is_log_in == False:
        return False
    elif no_log_in == False and is_log_in == True:
        return True
    else:
        print("看起来发生了一些不可表述的错误...\n no_log_in=" + str(no_log_in) + "is_log_in=" + str(is_log_in))


#######################################################################################################

def keys_to_str(keys):
    r = ''
    for s in keys:
        r += (" " + str(s))
    return r


################################################写入模块，包括json#######################################################
def write_to_json(weibo_list):
    file_name = os.path.join(Out_put_dir, "WEIBO_SRARCH_RES.json")
    print("正在写入：" + file_name)
    with open(file_name, "w+", encoding="utf-8") as f:
        f.write(json.dumps(weibo_list, ensure_ascii=False))


#######################################################################################################

##################################################对搜索页面（百度）进行处理####################################################
def go_for_a_search_page():
    global Search_res
    global d
    global page
    global max_page_num
    global name_set
    global Out_Keys
    time.sleep(0.5)
    res = d.find_elements_by_css_selector(".t>a")
    print(res)
    for r in res:
        is_append = True
        for ss in Out_Keys:  # 关键词屏蔽
            if str(r.text).find(ss) >= 0:
                is_append = False
                break
        for ss in Out_equal_keys:  # 全词匹配屏蔽
            if str(r.text) == ss:
                is_append = False
                break

        if is_append:
            Search_res.append(str(r.get_attribute("href")))
            name_set.append([str(r.text), str(r.get_attribute("href"))])
        else:
            print("标题:" + str(r.text) + " 是不符合要求的。")
            print("过滤1条内容")

#######################################################################################################

d.get("http://www.weibo.cn")



##############################################登录循环#########################################################
while True:
    login_state = test_login_state()
    if login_state is False:
        a = input("检测到您未登录！ 要继续，需要一个登录。是否进行登录操作?[y/n]\n >")
        if a == 'y' or a == 'Y':
            print("即将打开登陆页面...")
            try:
                d.find_element_by_link_text("登录").click()
            except:
                print("您貌似自己进行了操作.")
            a = input("您完成登录了吗？完成后可继续。[y/n]\n >")
            if a == 'y' or a == 'Y':
                continue
        else:
            d.close()
            exit()
    elif login_state is True:
        print("检测到您已经成功地登录！")
        break
#######################################################################################################


print("现在即将进入搜索的模块。")
if len(Keys) > 0:
    print("代码中已经制定了关键词。是：")
else:
    Keys = input("请输入关键词，以空格键分隔!\n >").split(' ')
print(Keys)

a = input("确认现在开始搜索[y/n]")
if a != 'y' and a != 'Y':
    print(a)
    d.close()
    exit()
"""
d.find_element_by_link_text('搜索').click()
d.find_element_by_name('keyword').send_keys(keys_to_str(Keys))# 发送关键词！
d.find_element_by_name('smblog').click()
"""
#######################################################################################################

########################################进入搜索模块#############################################################
print("现在将切换到百度进行搜索。")
d.get('https://www.baidu.com')
d.find_element_by_id('kw').send_keys(keys_to_str(Keys) + " site:weibo.cn")
d.find_element_by_id('su').click()
page = 1

while True:
    print("当前是第 " + str(page) + " 页的搜索内容.")
    go_for_a_search_page()
    print(Search_res)
    print(len(Search_res))

    if (page >= max_page_num):
        print("退出搜索")
        break
    s = d.find_elements_by_link_text("下一页 >")
    if len(s) == 1:
        page += 1
        s[0].click()
        time.sleep(0.5)
        continue
    else:
        print("没有下一页了，现在退出.")
        break

print(Search_res)
#######################################################################################################
write_name()
##########################################访问的模块！##################################################
All_Res_Set = []
i = 1
for lnk in Search_res:
    print("%d - %d" % (i, len(Search_res)))
    i += 1
    f_res = go_for_a_weiboCN(lnk)
    if len(f_res) != 0:
        All_Res_Set.append(f_res)
    else:
        print("略去一个。")
#######################################################################################################

##########################################写入的模块！##################################################
write_to_json(All_Res_Set)

######################################################################################################
time.sleep(10)
# d.close()

"""with webdriver.Chrome(executable_path="C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe") as d:
try:
d.get("http://www.weibo.cn")
except BaseException:
print("Error 1.")
# d.find_element_by_link_text("登录").click()

c = d.find_element_by_id('ppp')
print(c)"""
